Use case: UART TX in DMA mode

Sequence diagram

UART transmit in DMA mode

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "UARTX_IRQHandler" as p5
participant "DMA" as p3
participant "DMAx_IRQHandler" as p4

== initialization and configuration ==
== UART HAL Transmit DMA ==
p1->p2: <color: green> HAL_UART_Transmit_DMA(&huart,aTxBuffer, DATA_TO_SEND_SIZE)
note over p2 #00FF00
Transmitting data ongoing
end note
p2->p3: HAL_DMA_Start_IT()
p3-->p2: HAL_OK
p2-->p1: HAL_OK

p4<-: DMAx complete interrupt
p4->p3: HAL_DMA_IRQHandler
note over p3 #00FF00
End of transmitting data
end note
p3->p2: XferCpltCallback
p2->p2: Enable UARTx Transmit Complete IRQ (TCIE)
p5<-: UARTx Transmit Complete (TCIE)
p5->p2: HAL_UART_IRQHandler
p2->p1: HAL_UART_TxCpltCallback(huart->TxXferCount)
@enduml

Code snippet

HAL1

HAL2

#define DATA_TO_SEND_SIZE  255

UART_HandleTypeDef huart;

uint8_t aTxBuffer[DATA_TO_SEND_SIZE] = " **** UART Communication **** ";


    /* Ensure that all required peripherals
      (USART, GPIO,NVIC,DMA etc.) are configured properly
    /*
    ...
    */

    /* UART register Transmit complete user callback */
    HAL_UART_RegisterCallback(&huart, HAL_UART_TX_CB_ID,
                              UART_TxCpltCallback);

    /* Start a UART Process in dma mode */
    HAL_UART_Transmit_DMA(&huart, aTxBuffer,
                              DATA_TO_SEND_SIZE)
#define DATA_TO_SEND_SIZE  255

hal_uart_handle_t huart;

uint8_t aTxBuffer[DATA_TO_SEND_SIZE] = " **** UART Communication **** ";


    /* Ensure that all required peripherals
      (USART, GPIO,NVIC,DMA etc.) are configured properly
    /*
    ...
    */

    /* UART register Transmit complete user callback */
    HAL_UART_RegisterTxCpltCallback(&huart, UART_TxCpltCallback);


    /* Start a UART Process in dma mode */
    HAL_UART_Transmit_DMA(&huart, aTxBuffer,
                              DATA_TO_SEND_SIZE)

Key changes

  1. HAL2 DMA start uses HAL_DMA_StartPeriphXfer_IT_Opt() (optional interrupt generation) instead of HAL_DMA_Start_IT().

  2. HAL2 uses byte-oriented transfer count fields (for example tx_xfer_count).